use std::vec;
// Rust 提供了一些方法来创建迭代器，例如 iter(不可变迭代器)、iter_mut(可变迭代器) 方法 into_iter(所有权迭代器) 和 ，以及 range（例如 0..10）、repeat 和 cycle 等函数
// iter 不可变迭代器
pub fn create_dd1() {
    let num_arr = vec![1, 2, 3, 4, 5];
    let mut arr_iter = num_arr.iter();
    println!("不可变迭代, 不会消费合集，不可改变迭代元素！");
    println!("{:?}", arr_iter.next());
    println!("{:?}", arr_iter.next());
    println!("{:?}", arr_iter.next());
    println!("{:?}", arr_iter.next());
    println!("{:?}", arr_iter.next());
    println!("{:?}", arr_iter.next());
}

// iter_mut 可变迭代器
pub fn create_dd2() {
    let mut num_arr = vec![1, 2, 3, 4];
    println!("可变迭代，不会消费合适，可改变元素!");
    let arr_iter = num_arr.iter_mut();
    // 注意：使用闭包捕获的 x 是 &mut 引用，想要修改使用 *解引用获取实际的元素值，在修改值
    arr_iter.for_each(|x| *x += 1);
    println!("可变迭代 => {:?}", num_arr);
}

// into_iter 所有权迭代器
pub fn create_dd3() {
    let num_arr = vec![1, 2, 3, 4];
    println!("所有权迭代器，会消费，此时vec已经被回收♻️！");
    let arr_iter = num_arr.into_iter();
    let mut new_num_arr = Vec::new();
    arr_iter.for_each(|x| new_num_arr.push(x));
    // println!("{:?}", num_arr); // 报错，所有权已经转移，num已经被消费(回收)
}

// for_each 迭代器循环
pub fn create_dd4() {
    let num = vec![1, 2, 3, 4];
    let arr_iter = num.iter();
    arr_iter.for_each(|x| println!("for_each 迭代器循环 => {}", x));
}

// for 迭代器循环
pub fn create_dd5() {
    let num = vec![1, 2, 3, 4];
    let arr_iter = num.iter();
    for item in arr_iter {
        println!("for 迭代器循环 => {}", item);
    }
}

// === 迭代器元素操作方法 ===
pub fn create_dd6() {
    let num = vec![1, 2, 3, 4];
    let arr_num: Vec<u32> = num.iter().map(|x| x + 1).collect();
    println!("map => {:?}", arr_num);
    println!("{:?}", num);

    let mut num2 = vec![1, 2, 3, 4];
    let arr_num2: Vec<u32> = num2.iter_mut().map(|x| *x + 2).collect();
    println!("map可变 => {:?}", arr_num2);
    println!("{:?}", num2);

    let num3 = vec![1, 2, 3, 4];
    let arr_num3: Vec<u32> = num3.into_iter().map(|x| x + 1).collect();
    println!("map所有权 => {:?}", arr_num3);
    // println!("{:?}", num3); 所有权 报错！！！！！！
}

pub fn create_dd7() {
    let num = vec![1, 2, 3, 4];
    let arr_num: Vec<&u32> = num.iter().filter(|x| **x > 3).collect();
    println!("filter 不可变=> {:?}", arr_num);

    let mut num2 = vec![1, 2, 3, 4];
    let arr_num2: Vec<&mut u32> = num2.iter_mut().filter(|x| **x > 2).collect();
    println!("filter 可变=> {:?}", arr_num2);

    let num3 = vec![1, 2, 3, 4];
    let arr_num3: Vec<u32> = num3.into_iter().filter(|x| *x > 2).collect();
    println!("filter 所有权 => {:?}", arr_num3);
}
